#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>

// 隔一秒打印一次pending表
// 向进程发送信号，观察pending表对应位置由0变1
// 自定义捕捉，信号递达，观察pending表对应位置由1变0
// 对信号进行屏蔽，查看屏蔽后的信号pending表中1不变0，无法递达。

void handler(int sig)
{
    std::cout << "当前进程pid：" << getpid() << "收到了一个" << sig << "号信号" << std::endl;
}

void PrintPending(sigset_t set)
{
    std::cout << "当前进程pid：" << getpid() << "，pending表:";
    for (int i = 31; i >= 1; i--)
    {
        if (sigismember(&set, i))
            std::cout << "1";
        else
            std::cout << "0";
    }
    std::cout << std::endl;
}

int main()
{
    // 自定义捕捉所有信号
    for (int i = 0; i <= 31; i++)
        signal(i, handler);
    // 将信号集只保留2号信号
    sigset_t sigset,
        osigset;
    sigemptyset(&sigset);
    sigaddset(&sigset, SIGINT);
    // // 将阻塞表设置为只阻塞2号信号
    // sigprocmask(SIG_SETMASK, &sigset, &osigset);
    // 将阻塞表设置为阻塞所有信号
    sigfillset(&sigset);
    sigprocmask(SIG_SETMASK, &sigset, &osigset);

    // 获取pending信号集，并每隔一秒打印
    sigset_t set;
    while (1)
    {
        sigpending(&set);
        PrintPending(set);
        sleep(1);
    }

    return 0;
}